home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / bin / sniff.py < prev    next >
Text File  |  2006-06-30  |  3KB  |  108 lines

  1. #!/usr/bin/python
  2. # Copyright (c) 2003 CORE Security Technologies
  3. #
  4. # This software is provided under under a slightly modified version
  5. # of the Apache Software License. See the accompanying LICENSE file
  6. # for more information.
  7. #
  8. # $Id: sniff.py,v 1.4 2003/10/27 17:36:56 jkohen Exp $
  9. #
  10. # Simple packet sniffer.
  11. #
  12. # This packet sniffer uses the pcap library to listen for packets in
  13. # transit over the specified interface. The returned packages can be
  14. # filtered according to a BPF filter (see tcpdump(3) for further
  15. # information on BPF filters).
  16. #
  17. # Note that the user might need special permissions to be able to use pcap.
  18. #
  19. # Authors:
  20. #  Maximiliano Caceres <max@coresecurity.com>
  21. #  Javier Kohen <jkohen@coresecurity.com>
  22. #
  23. # Reference for:
  24. #  pcapy: findalldevs, open_live.
  25. #  ImpactDecoder.
  26.  
  27. import sys
  28. import string
  29. from threading import Thread
  30.  
  31. import pcapy
  32. from pcapy import findalldevs, open_live
  33. import impacket
  34. from impacket.ImpactDecoder import EthDecoder, LinuxSLLDecoder
  35.  
  36. class DecoderThread(Thread):
  37.     def __init__(self, pcapObj):
  38.         # Query the type of the link and instantiate a decoder accordingly.
  39.         datalink = pcapObj.datalink()
  40.         if pcapy.DLT_EN10MB == datalink:
  41.             self.decoder = EthDecoder()
  42.         elif pcapy.DLT_LINUX_SLL == datalink:
  43.             self.decoder = LinuxSLLDecoder()
  44.         else:
  45.             raise Exception("Datalink type not supported: " % datalink)
  46.  
  47.         self.pcap = pcapObj
  48.         Thread.__init__(self)
  49.  
  50.     def run(self):
  51.         # Sniff ad infinitum.
  52.         # PacketHandler shall be invoked by pcap for every packet.
  53.         self.pcap.loop(0, self.packetHandler)
  54.  
  55.     def packetHandler(self, hdr, data):
  56.         # Use the ImpactDecoder to turn the rawpacket into a hierarchy
  57.         # of ImpactPacket instances.
  58.         # Display the packet in human-readable form.
  59.         print self.decoder.decode(data)
  60.  
  61.  
  62. def getInterface():
  63.     # Grab a list of interfaces that pcap is able to listen on.
  64.     # The current user will be able to listen from all returned interfaces,
  65.     # using open_live to open them.
  66.     ifs = findalldevs()
  67.  
  68.     # No interfaces available, abort.
  69.     if 0 == len(ifs):
  70.         print "You don't have enough permissions to open any interface on this system."
  71.         sys.exit(1)
  72.  
  73.     # Only one interface available, use it.
  74.     elif 1 == len(ifs):
  75.         print 'Only one interface present, defaulting to it.'
  76.         return ifs[0]
  77.  
  78.     # Ask the user to choose an interface from the list.
  79.     count = 0
  80.     for iface in ifs:
  81.         print '%i - %s' % (count, iface)
  82.         count += 1
  83.     idx = int(raw_input('Please select an interface: '))
  84.  
  85.     return ifs[idx]
  86.  
  87. def main(filter):
  88.     dev = getInterface()
  89.  
  90.     # Open interface for catpuring.
  91.     p = open_live(dev, 1500, 0, 100)
  92.  
  93.     # Set the BPF filter. See tcpdump(3).
  94.     p.setfilter(filter)
  95.  
  96.     print "Listening on %s: net=%s, mask=%s, linktype=%d" % (dev, p.getnet(), p.getmask(), p.datalink())
  97.  
  98.     # Start sniffing thread and finish main thread.
  99.     DecoderThread(p).start()
  100.  
  101. # Process command-line arguments. Take everything as a BPF filter to pass
  102. # onto pcap. Default to the empty filter (match all).
  103. filter = ''
  104. if len(sys.argv) > 1:
  105.     filter = ' '.join(sys.argv[1:])
  106.  
  107. main(filter)
  108.